package com.le.tester.book.concurrentchallenge.threadSafedelegation;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * createTime：2025-03-18 9:29
 * description：不要这么做，非线程安全
 */
public class ListHelper<E> {

    public List<E> list = Collections.synchronizedList(new ArrayList<>());


    //1.为什么不是线程安全的呢？明明整个方法已经加入和synchronized同步锁
    //类比一下查找数据库是否存在，再新增一条数据，整个的操作分出了两条sql，读数据和写数据，写的过程中，其他线程可能读到了还没写人的新数据，自此没有了正确性
    //那可能的就是使用数据库的版本客观锁，或者将两个操作合并成一个操作。
    //总的就是要加锁保护住判断时的状态
    public synchronized boolean putIfAbsent(E x) {
        boolean absent = !list.contains(x);
        if (absent) {
            list.add(x);
        }
        return absent;
    }

}
